﻿/**
 * @file NisLinearRange_Struct.h
 * @brief NisLinearRange
 * @details 
 * @mainpage http://www.navinfo.com/
 * @author Navinfo
 * @email 400-810-0880
 * @license Navinfo Co.,Ltd. All rights reserved
 */
#ifndef	__NISLINEARRANGESTRUCT_H_
#define	__NISLINEARRANGESTRUCT_H_

PRAGMA_PACK_PUSH

namespace Navinfo {
namespace Nis {

class CPathRange;
class CPercentageRange;
class CLinearRangeFlag;
class CLinearRange;
class CPathRangeSet;
class CLinearRangeSet;



/**
 * @brief 以形状点的索引值来表示线性对象上的范围
 * 
 */
class DLL_PUBLIC CPathRange
{
public:
	CPathRange();

	explicit CPathRange(
		  const ushort &m_usStart_
		, const ushort &m_usEnd_ = 0
		);

public:
	/**
	 * @brief 取得Start
	 *
	 * @return 开始位置
	 */
	const ushort& GetStart() const;

	/**
	 * @brief 取得End
	 *
	 * @return 结束位置
	 */
	const ushort& GetEnd() const;


public:
	ushort														m_usStart;									///<	  开始位置  
	ushort														m_usEnd;									///<	  结束位置  
};


/**
 * @brief 以百分比来表示线性对象上的范围
 * 
 */
class DLL_PUBLIC CPercentageRange
{
public:
	CPercentageRange();

	explicit CPercentageRange(
		  const uchar &m_ucNumBits_
		, const uint &m_uiStartPosition_ = 0
		, const uint &m_uiEndPosition_ = 0
		);

public:
	/**
	 * @brief 取得StartPosition
	 *
	 * @return 开始位置
	 */
	const uint& GetStartPosition() const;

	/**
	 * @brief 取得EndPosition
	 *
	 * @return 结束位置
	 */
	const uint& GetEndPosition() const;

	/**
	 * @brief 取得NumBits
	 *
	 * @return 定义用于存储参数值的位数
	 */
	const uchar& GetNumBits() const;


public:
	uint														m_uiStartPosition;							///<	  开始位置  
	uint														m_uiEndPosition;							///<	  结束位置  
	uchar														m_ucNumBits;								///<	  定义用于存储参数值的位数  
};


/**
 * @brief LinearRangeFlag
 * 
 */
class DLL_PUBLIC CLinearRangeFlag
{
public:
	CLinearRangeFlag();

	explicit CLinearRangeFlag(
		uchar v_ 
		);

public:
	/**
	 * @brief 取得PercentageRangeFlag
	 * @details 
	 *
	 * @return PercentageRangeFlag
	 */
	uchar GetPercentageRangeFlag() const;

	/**
	 * @brief 取得PathRangeFlag
	 * @details 
	 *
	 * @return PathRangeFlag
	 */
	uchar GetPathRangeFlag() const;


public:
	union {
		uchar													v;
		struct {
			uchar												m_ucPercentageRangeFlag		: 1;			///<	  PercentageRangeFlag  
			uchar												m_ucPathRangeFlag			: 1;			///<	  PathRangeFlag  
		};
	};
};


/**
 * @brief 线性对象上的范围
 * 
 */
class DLL_PUBLIC CLinearRange
{
public:
	CLinearRange();

	explicit CLinearRange(
		  const CLinearRangeFlag &m_clFlag_
		, const CPathRange &m_clPathRange_ = CPathRange()
		, const CPercentageRange &m_clPercentageRange_ = CPercentageRange()
		);

public:
	/**
	 * @brief 取得Flag
	 *
	 * @return Flag
	 */
	const CLinearRangeFlag& GetFlag() const;

	/**
	 * @brief 取得PathRange
	 *
	 * @return 表示形状点的索引值，通常用于LinkGeo和Link。索引值从0开始。
	 */
	const CPathRange& GetPathRange() const;

	/**
	 * @brief 取得PercentageRange
	 *
	 * @return 表示百分比。但是需要注意，为了同时兼容精细与粗略的百分比，这里的分子为StartPosition与EndPosition，但是分母为2^NumBits-1，即 (1<<NumBits)-1。
	 */
	const CPercentageRange& GetPercentageRange() const;


public:
	CLinearRangeFlag											m_clFlag;									///<	  Flag  
	CPathRange													m_clPathRange;								///<	  表示形状点的索引值，通常用于LinkGeo和Link。索引值从0开始。  
	CPercentageRange											m_clPercentageRange;						///<	  表示百分比。但是需要注意，为了同时兼容精细与粗略的百分比，这里的分子为StartPosition与EndPosition，但是分母为2^NumBits-1，即 (1<<NumBits)-1。  
};


/**
 * @brief 以形状点的索引值来表示线性对象上的范围的集合
 * 
 */
class DLL_PUBLIC CPathRangeSet
{
public:
	CPathRangeSet();

	explicit CPathRangeSet(
		  const vector< CPathRange > &m_vclPathRangeList_
		);

public:
	/**
	 * @brief 取得PathRangeList的数量
	 *
	 * @return PathRangeList的数量
	 */
	size_t GetNumPathRangeList() const;

	/**
	 * @brief 取得数组PathRangeList中下标为iNo的元素
	 * @details 
	 *
	 * @return 定义几何图形的位置范围
	 */
	const CPathRange& GetPathRangeList( size_t iNo ) const;

	/**
	 * @brief 取得PathRangeList
	 *
	 * @return 定义几何图形的位置范围
	 */
	const vector< CPathRange >& GetPathRangeList() const;


public:
	vector< CPathRange >										m_vclPathRangeList;							///<	  定义几何图形的位置范围  
};


/**
 * @brief 以百分比来表示线性对象上的范围的集合
 * 
 */
class DLL_PUBLIC CLinearRangeSet
{
public:
	CLinearRangeSet();

	explicit CLinearRangeSet(
		  const vector< CLinearRange > &m_vclLinearRangeList_
		);

public:
	/**
	 * @brief 取得LinearRangeList的数量
	 *
	 * @return LinearRangeList的数量
	 */
	size_t GetNumLinearRangeList() const;

	/**
	 * @brief 取得数组LinearRangeList中下标为iNo的元素
	 * @details 
	 *
	 * @return 在一个线性的对象（Link、LinkGeo、Lane等）上的范围。有两种表现形式：形状点的索引值和百分比。
	 */
	const CLinearRange& GetLinearRangeList( size_t iNo ) const;

	/**
	 * @brief 取得LinearRangeList
	 *
	 * @return 在一个线性的对象（Link、LinkGeo、Lane等）上的范围。有两种表现形式：形状点的索引值和百分比。
	 */
	const vector< CLinearRange >& GetLinearRangeList() const;


public:
	vector< CLinearRange >										m_vclLinearRangeList;						///<	  在一个线性的对象（Link、LinkGeo、Lane等）上的范围。有两种表现形式：形状点的索引值和百分比。  
};

}
}

PRAGMA_PACK_POP

#endif	//	__NISLINEARRANGESTRUCT_H_
